package com.hubu.mapper;

import com.hubu.model.NodeItem;
import com.hubu.request.GraphQuery;
import com.hubu.request.NodeCoordinateItem;
import com.hubu.utils.GraphPageRecord;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author xiedi
 * @Date: 2022/11/5
 */
public interface KGGraphDao {
    /**
     * 领域标签分页
     * @param queryItem
     * @return
     */
    GraphPageRecord<HashMap<String, Object>> getPageDomain(GraphQuery queryItem);
    /**
     * 删除Neo4j 标签
     *
     * @param domain
     */
    void deleteKgDomain(String domain);

    /**
     * 查询图谱节点和关系
     *
     * @param query
     * @return node relationship
     */
    HashMap<String, Object> getDomainGraph(GraphQuery query);

    /**
     * 获取节点列表
     *
     * @param domain
     * @param pageIndex
     * @param pageSize
     * @return
     */
    HashMap<String, Object> getDomainNodes(String domain, Integer pageIndex, Integer pageSize);

    /**
     * 获取某个领域指定节点拥有的上下级的节点数
     *
     * @param domain
     * @param nodeId
     * @return long 数值
     */
    long getRelationNodeCount(String domain, long nodeId);

    /**
     * 创建领域,默认创建一个新的节点,给节点附上默认属性
     *
     * @param domain
     */
    void createDomain(String domain);
    void quickCreateDomain(String domain,String nodeName);
    /**
     * 获取/展开更多节点,找到和该节点有关系的节点
     *
     * @param domain
     * @param nodeId
     * @return
     */
    HashMap<String, Object> getMoreRelationNode(String domain, String nodeId, Integer round);

    /**
     * 更新节点名称
     *
     * @param domain
     * @param nodeId
     * @param nodeName
     * @return 修改后的节点
     */
    HashMap<String, Object> updateNodeName(String domain, String nodeId, String nodeName);

    /**
     * 创建单个节点
     *
     * @param domain
     * @param entity
     * @return
     */
    HashMap<String, Object> createNode(String domain, NodeItem entity);
    HashMap<String, Object> createNodeWithUUid(String domain, NodeItem entity);

    /**
     * 批量创建节点和关系
     *
     * @param domain
     *            领域
     * @param sourceName
     *            源节点
     * @param relation
     *            关系
     * @param targetNames
     *            目标节点数组
     * @return
     */
    HashMap<String, Object> batchCreateNode(String domain, String sourceName,String sourceId, String relation, String[] targetNames);

    /**
     * 批量创建下级节点
     *
     * @param domain
     *            领域
     * @param sourceId
     *            源节点id
     * @param entityType
     *            节点类型
     * @param targetNames
     *            目标节点名称数组
     * @param relation
     *            关系
     * @return
     */
    HashMap<String, Object> batchCreateChildNode(String domain, String sourceId, Integer entityType,
                                                 String[] targetNames, String relation);

    /**
     * 批量创建同级节点
     *
     * @param domain
     *            领域
     * @param entityType
     *            节点类型
     * @param sourceNames
     *            节点名称
     * @return
     */
    List<HashMap<String, Object>> batchCreateSameNode(String domain, Integer entityType, String[] sourceNames);

    /**
     * 添加关系
     *
     * @param domain
     *            领域
     * @param sourceId
     *            源节点id
     * @param targetId
     *            目标节点id
     * @param ship
     *            关系
     * @return
     */
    HashMap<String, Object> createLink(String domain, String targetDomain, long sourceId, long targetId, String ship);
    HashMap<String, Object> createLinkByUuid(String domain, long sourceId, long targetId, String ship);

    /**
     * 更新关系
     *
     * @param domain
     *            领域
     * @param shipId
     *            关系id
     * @param shipName
     *            关系名称
     * @return
     */
    HashMap<String, Object> updateLink(String domain, long shipId, String shipName);

    /**
     * 删除节点(先删除关系再删除节点)
     *
     * @param domain
     * @param nodeId
     * @return
     */
    HashMap deleteNode(String domain, long nodeId);

    /**
     * 删除关系
     *
     * @param domain
     * @param shipId
     */
    void deleteLink(String domain, long shipId);

    /**
     * 段落识别出的三元组生成图谱
     *
     * @param domain
     * @param entityType
     * @param operateType
     * @param sourceId
     * @param rss
     *            关系三元组
     *            [[startname;ship;endname],[startname1;ship1;endname1],[startname2;ship2;endname2]]
     * @return node relationship
     */
    HashMap<String, Object> createGraphByText(String domain, Integer entityType, Integer operateType, Integer sourceId,
                                              String[] rss);
    /**
     * 批量创建节点，关系
     * @param domain
     * @param params 三元组 sourceNode,relationship,targetNode
     */
    void batchCreateGraph(String domain, List<Map<String,Object>> params);

    /**
     * 批量更新节点坐标
     * @param domain
     * @param params
     */
    void batchUpdateGraphNodesCoordinate(String domain,List<NodeCoordinateItem> params);
    /**
     * 更新节点有无附件
     * @param domain
     * @param nodeId
     * @param status
     */
    void updateNodeFileStatus(String domain,long nodeId, int status);

    /**
     * 更新图谱节点的图片
     * @param domain
     * @param nodeId
     * @param img
     */
    void updateNodeImg(String domain, long nodeId, String img);

    /**
     * 移除节点图片
     * @param domain
     * @param nodeId
     */
    void removeNodeImg(String domain, long nodeId);
    /**
     * 导入csv
     * @param domain
     * @param csvUrl
     * @param status
     */
    void batchInsertByCsv(String domain, String csvUrl, int status) ;
    void updateCoordinateOfNode(String domain, String uuid, Double fx, Double fy);

    HashMap<String, Object> getNodes(NodeItem nodeItem);

    HashMap<String, Object> getEntityLinks(NodeItem nodeItem);

    HashMap<String, Object> getCompeteCompany(NodeItem nodeItem);

    HashMap<String, Object> getcooperateCompany(NodeItem nodeItem);

    HashMap<String, Object> getHiddenRelation(NodeItem nodeItem);

    HashMap<String, Object> getCompanyRisk(NodeItem nodeItem);

    HashMap<String, Object> getCompanyProduct(NodeItem nodeItem);

    HashMap<String, Object> getArticulationProductGraph(String productName);

    HashMap<String, Object> getEtfLink(String number);
}
